﻿using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using YookingBizWQW.Class.Public;
using YookingDBNormal.Class;
using YookingFileIO.Class;
using YookingKitBox.Class.Public;
using YookingSvrDBCall.Class.DBLogic;
using YookingSvrDBCall.Class.DBPub;

namespace YookingBizWQW.Class.Credit.mp
{
    public class clsTradeOrder_Old
    {
        //注释：王庆文 2020年04月29日=========================================================================
        //还款计划保存成功之后，需要为该计划设置N条刷卡、还款交易订单记录（用于提交到银行支付接口）。
        //根据UnitCode、PersonCode、PlanID查询还款计划，然后为该还款计划生成N条用于跟银行对接的交易订单记录。
        //向库表XYK_TradeOrder中写入记录。
        public string CreateRepayTradeOrder(string strB64RequestData)
        {
            string strRtData = "no data";

            //先进行解密，然后在进行中文解码，最后得到明文的请求数据
            string strRequestData = clsHandleData.DeUrlRequest(strB64RequestData);

            #region 将strRequestData包含的各种参数一一解析出来

            string strUnitCode = "CHN000"; //平台编码
            string strPersonCode = "0000"; //人员编码
            string strPlanID = "00000000"; //计划ID

            //这些参数用★分隔开，客户端与服务器端要一致
            string[] strArray = strRequestData.Split('★');
            if (strArray.Length >= 3)
            {
                strUnitCode = strArray[0];
                strPersonCode = strArray[1];
                strPlanID = strArray[2];
            }

            #endregion

            //将刚刚保存入库的总计划信息查询出来（只有一条符合条件的记录）
            DataSet dsPlan = GetRepayPlanInfo(strUnitCode, strPersonCode, strPlanID);

            //提现计划保存成功之后，需要为该计划
            //设置N条交易订单记录（用于提交到银行支付接口）
            strRtData = SaveTradePlanToServer(dsPlan); 

            return strRtData; //交易订单的处理结果
        }

        #region 根据总的还款计划，生成对应的真实交易的N条子订单

        #region 生成和写入真实交易订单的业务函数

        //注释：王庆文 2020年04月30日=====================================================================================
        //提现计划保存成功之后，需要为该计划设置N条交易订单记录（用于提交到银行支付接口）
        //还款计划生成规则如下：
        //1、每天最多4笔刷卡业务，最多2笔还款业务；
        //2、刷卡时段、还款时段的定义
        //   09:00 - 10:00  刷卡
        //   11:00 - 12:00  刷卡
        //   13:00 - 14:00  还款 = 前两笔的刷卡总额
        //   15:00 - 16:00  刷卡
        //   17:00 - 18:00  刷卡
        //   19:00 - 20:00  还款 = 前两笔的刷卡总额
        //3、还款计划公式：
        //   （1）【还款花费的总天数(iDays)】=(【截至日期】-【开始日期】) + 1
        //   （2）【每天需要的刷卡金额(iAmountPerday)】=【计划还款总金额】/【还款花费的总天数(iDays)】
        //   （3）if(iAmountPerday >= 600) 
        //          【每天需要刷卡的笔数(iPOSCount)】 = 4
        //          【每笔刷卡的金额(iAmountPercount)】= iAmountPerday / 4
        //        if(iAmountPerday < 600) 
        //          【每天需要刷卡的笔数(iPOSCount)】 = 【每天需要的刷卡金额(iAmountPerday)】/200
        //          【每笔刷卡的金额(iAmountPercount)】= iAmountPerday /【每天需要刷卡的笔数(iPOSCount)】
        private string SaveTradePlanToServer(DataSet dsPlan)
        {
            int iShuaKOrderCount = 0; //总共生成了几笔刷卡订单
            int iHuanKOrderCount = 0; //总共生成了几笔还款订单

            if (dsPlan != null && dsPlan.Tables.Count > 0 && dsPlan.Tables[0].Rows.Count > 0)
            {
                DataTable dtPlan = dsPlan.Tables[0];

                #region 将DataSet中的字段值全部解析出来，以备后面的逻辑使用

                //string strUnitCode = dtPlan.Rows[0]["UNITCODE"].ToString();         //平台编码 
                //string strPersonCode = dtPlan.Rows[0]["PERSONCODE"].ToString();     //制定人员 
                //string strPlanID = dtPlan.Rows[0]["PLANID"].ToString();             //计划ID 
                string strPlanType = dtPlan.Rows[0]["PLANTYPE"].ToString();           //计划类型：POS=信用卡代还，ATM=信用卡套现，HBEI=花呗代还 
                string strPlanTime = dtPlan.Rows[0]["PLANTIME"].ToString();           //制定时间 
                string strEnBankCardNo = dtPlan.Rows[0]["BANKCARDNO"].ToString();     //信用卡卡号（密文） 
                string strPlanAmount = dtPlan.Rows[0]["PLANAMOUNT"].ToString();       //计划金额 
                string strPlanDateBegin = dtPlan.Rows[0]["PLANDATEBEGIN"].ToString(); //开始日期 
                string strPlanDateEnd = dtPlan.Rows[0]["PLANDATEEND"].ToString();     //截止日期 
                string strPayCity = dtPlan.Rows[0]["PAYCITY"].ToString();             //预设消费城市 
                string strPlanState = dtPlan.Rows[0]["PLANSTATE"].ToString();         //计划状态 
                string strMemberLevel = dtPlan.Rows[0]["MEMBERLEVEL"].ToString();     //会员级别 
                string strOtherMemo = dtPlan.Rows[0]["OTHERMEMO"].ToString();         //还款计划总表中的其他说明 

                #endregion

                //去掉开始日期、截至日期后面的时间值，只保留 yyyy-MM-dd 格式的日期值
                strPlanDateBegin = strPlanDateBegin.Replace(" 00:00:00",""); 
                strPlanDateEnd = strPlanDateEnd.Replace(" 23:59:59", "");  

                //计划还款周期是几天？
                int iPlanDays = GetPlanDaysCount(strPlanDateBegin, strPlanDateEnd);

                double dPlanOKAmount = 0; //已生成的N条订单，涉及的计划总金额，最后修正金额时要使用
                double dAmountPerday = Convert.ToDouble(strPlanAmount) / iPlanDays; //每天需要的刷卡金额
                dAmountPerday = Math.Ceiling(dAmountPerday); //向上取整,有小数就整数部分加1 

                JArray objTmpHuanKJArray = new JArray(); //临时存放生成还款订单（与刷卡订单对应）需要的基础数据数组
                for (int i = 0; i < iPlanDays; i++) //先按照天数外循环
                {
                    double iPOSCount = 0; //每天需要刷卡的笔数
                    double iAmountPercount = 0; //每笔刷卡的金额
                    if (dAmountPerday >= 600)
                    {
                        iPOSCount = 4; //每天笔数赋固定值
                    }
                    else
                    {
                        //每天笔数，向上取整,有小数就整数部分加1  
                        iPOSCount = dAmountPerday / 200;
                        iPOSCount = Math.Ceiling(iPOSCount);
                    }

                    //每笔金额，向上取整,有小数就整数部分加1
                    iAmountPercount = dAmountPerday / iPOSCount;
                    iAmountPercount = Math.Ceiling(iAmountPercount);

                    //计划执行的日期值yyyy-MM-dd、时间、金额
                    string strTradeTime = "00:00:00"; //设定交易时间
                    double dTradeAmount = 0;          //设定交易金额       
                    
                    //计算提交支付通道的实际交易日期
                    DateTime dtTradeDate = Convert.ToDateTime(strPlanDateBegin).AddDays(i);
                    string strTradeDate = dtTradeDate.ToString("yyyy-MM-dd"); //精确到天

                    for (int j = 0; j < iPOSCount; j++) //再按刷卡次数内循环
                    {
                        strTradeTime = GetRandomTradeTime(j); //动态生成本次计划的交易时间
                        dTradeAmount = GetRandomTradeAmount(iAmountPercount); //动态生成本次计划的交易金额

                        double iLoopNumber = iPOSCount - 1; //最后一次循环的数字序号
                        if (strTradeDate == strPlanDateEnd && j == iLoopNumber)
                        {
                            //由于前面生成订单的交易金额都是随机生成的，因此最后一次
                            //随机金额可能与用户实际输入的还款额度有偏差，最后要修正一下金额。
                            dTradeAmount = Convert.ToDouble(strPlanAmount) - dPlanOKAmount;
                        }
                        //已经生成过订单的金额循环累计，最终=用户输入的还款金额
                        dPlanOKAmount = Convert.ToDouble(dPlanOKAmount) + dTradeAmount;
                        dPlanOKAmount = Math.Round(dPlanOKAmount, 2); //保留小数点后两位

                        //信用卡业务，需要同时设置刷卡和还款两种交易
                        //交易类型TradeType：
                        //POS01=信用卡刷卡、POS02=信用卡还款、ATM01=信用卡套刷、
                        //ATM02=信用卡套入、HBEI01=花呗消费、HBEI02=花呗还款、BKGE01=佣金提现
                        string strTradeType = strPlanType + "01"; //刷卡消费类交易
                        string strTradeDateTime = strTradeDate + " " + strTradeTime;
                        SaveTradeOrderToDB(dtPlan, strTradeType, strTradeDateTime, dTradeAmount); //本条刷卡交易订单入库
                        iShuaKOrderCount = iShuaKOrderCount + 1; //总共生成了几笔刷卡订单 

                        //将本次生成的刷卡订单存入临时数组，
                        //已备生成还款订单交易记录时使用。
                        JObject objTempData = new JObject();
                        objTempData.Add("TradeDate", strTradeDate);
                        objTempData.Add("TradeTime", strTradeTime);
                        objTempData.Add("TradeAmount", dTradeAmount);
                        objTmpHuanKJArray.Add(objTempData); //装入json数组
                    }
                }

                //clsRWFile myLog = new clsRWFile(); //将请求结果保存到txt文件中
                //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", objTmpHuanKJArray.ToString());

                if (strPlanType != "ATM") //非套现业务，除了刷卡计划之外，还需要设置还款计划
                {
                    //前面生成刷卡订单之后，紧接着要生成对应的还款订单。
                    iHuanKOrderCount = SaveHuankuanTradePlanToServer(dtPlan, objTmpHuanKJArray);
                }
            }

            return "【刷出订单"+ iShuaKOrderCount + "笔】【还款订单" + iHuanKOrderCount + "笔】";
        }

        //注释：王庆文 2020年04月30日============================================================================
        //如果用户选择的radio是信用卡还款业务，则前面生成刷卡订单之后，紧接着要生成对应的还款订单。
        private int SaveHuankuanTradePlanToServer(DataTable dtPlan, JArray objTempHkData)
        {
            //计划类型：POS=信用卡代还，ATM=信用卡套现，HBEI=花呗代还 
            string strPlanType = dtPlan.Rows[0]["PLANTYPE"].ToString();

            //还款计划截止日期，只保留 yyyy-MM-dd 格式 
            string strPlanDateEnd = dtPlan.Rows[0]["PLANDATEEND"].ToString();    
            strPlanDateEnd = strPlanDateEnd.Replace(" 23:59:59", "");

            int iHuanKOrderCount = 0; //总共生成了几笔还款订单
            int iArrayLength = objTempHkData.Count;
            for (int i = 0; i < iArrayLength; i++)
            {
                double dHkTradeAmount = 0; //设定还款交易金额 

                string strTradeDate = objTempHkData[i]["TradeDate"].ToString();     //还款日期
                string strTradeTime = objTempHkData[i]["TradeTime"].ToString();     //还款时间
                string strTradeAmount = objTempHkData[i]["TradeAmount"].ToString(); //还款金额

                dHkTradeAmount = Convert.ToDouble(dHkTradeAmount) + Convert.ToDouble(strTradeAmount);

                try
                {
                    int j = i + 1; //紧接着处理下一条数据

                    strTradeDate = objTempHkData[j]["TradeDate"].ToString();     //还款日期
                    strTradeTime = objTempHkData[j]["TradeTime"].ToString();     //还款时间
                    strTradeAmount = objTempHkData[j]["TradeAmount"].ToString(); //还款金额

                    dHkTradeAmount = Convert.ToDouble(dHkTradeAmount) + Convert.ToDouble(strTradeAmount);

                    i = i + 1; //处理完的数据下一轮寻的时候需要跳过
                }
                catch { }
              
                Random rdNumber = new Random();  //随机生成指定的信用卡还款时间值
                if (strTradeTime.CompareTo("09:00") >= 0 && strTradeTime.CompareTo("12:00") <= 0)
                {
                    strTradeTime = "13:" + rdNumber.Next(10, 59) + ":" + rdNumber.Next(10, 59);
                }
                else if (strTradeTime.CompareTo("15:00") >= 0 && strTradeTime.CompareTo("18:00") <= 0)
                {
                    strTradeTime = "19:" + rdNumber.Next(10, 59) + ":" + rdNumber.Next(10, 59);
                }

                //交易类型TradeType：
                //POS01=信用卡刷卡、POS02=信用卡还款、ATM01=信用卡套刷、
                //ATM02=信用卡套入、HBEI01=花呗消费、HBEI02=花呗还款、BKGE01=佣金提现
                string strTradeType = strPlanType + "02"; //还款订单类交易
                string strTradeDateTime = strTradeDate + " " + strTradeTime; //本条还款交易订单入库
                SaveTradeOrderToDB(dtPlan, strTradeType, strTradeDateTime, dHkTradeAmount);
                iHuanKOrderCount = iHuanKOrderCount + 1; //总共生成了几笔还款订单 
            }

            return iHuanKOrderCount; //得到还款订单总数
        }

        //注释：王庆文 2020年04月30日=========================================================================================
        //将刷卡、还款、套现等单条交易订单记录写入到后台数据库中
        private void SaveTradeOrderToDB(DataTable dtPlan, string strTradeType, string strTradeTime, double iTradeAmount)
        {
            #region 将DataSet中的字段值全部解析出来，以备后面的逻辑使用

            string strUnitCode = dtPlan.Rows[0]["UNITCODE"].ToString();           //平台编码 
            string strPersonCode = dtPlan.Rows[0]["PERSONCODE"].ToString();       //制定人员 
            string strPlanID = dtPlan.Rows[0]["PLANID"].ToString();               //计划ID 
            string strPlanType = dtPlan.Rows[0]["PLANTYPE"].ToString();           //计划类型：POS=信用卡代还，ATM=信用卡套现，HBEI=花呗代还 
            string strPlanTime = dtPlan.Rows[0]["PLANTIME"].ToString();           //制定时间 
            string strEnBankCardNo = dtPlan.Rows[0]["BANKCARDNO"].ToString();     //信用卡卡号（密文） 
            string strPlanAmount = dtPlan.Rows[0]["PLANAMOUNT"].ToString();       //计划金额 
            string strPlanDateBegin = dtPlan.Rows[0]["PLANDATEBEGIN"].ToString(); //开始日期 
            string strPlanDateEnd = dtPlan.Rows[0]["PLANDATEEND"].ToString();     //截止日期 
            string strPayCity = dtPlan.Rows[0]["PAYCITY"].ToString();             //预设消费城市 
            string strPlanState = dtPlan.Rows[0]["PLANSTATE"].ToString();         //计划状态 
            string strMemberLevel = dtPlan.Rows[0]["MEMBERLEVEL"].ToString();     //会员级别 
                                                                                  //string strOtherMemo = dtPlan.Rows[0]["OTHERMEMO"].ToString();       //还款计划总表中的其他说明 

            #endregion

            #region 进行逻辑运算，为写库准备字段参数值

            #region 相对为固定值的基础参数

            //生成平台交易订单号
            Random rd = new Random(); //随机数实例
            int iRandom = rd.Next(100000, 999999); //生成六位随机数
            string strCurTime = DateTime.Now.ToString("yyyyMMddHHmmssfff");

            //订单号格式示例：CHNPOS20200502225459620954773
            string strFrontNum = strUnitCode.Substring(0, 3) + strPlanType;
            string strPOrderNum = strFrontNum + strCurTime + iRandom.ToString();

            //信用卡对应的预留手机号
            string strTrMobilePhone = GetCreditCardPhone(strUnitCode, strPersonCode, strEnBankCardNo);

            //查询平台里指定交易类型的单笔交易费率、以及固定笔数费
            string[] arryFeeRate = GetTradeFeeRate(strUnitCode, strTradeType);
            string strFeeRate = arryFeeRate[0]; //交易费率
            string strFeeFix = arryFeeRate[1];  //订单笔数费

            //查询平台里指定计划类型的，指定级别的会员可以享受的交易费率折扣
            string strDiscount = GetMemberDiscount(strUnitCode, strPlanType, strMemberLevel);

            //如果是信用卡套现，则结算卡要填写银行借记卡信息      
            string strSettleCardNo = strEnBankCardNo; //结算借记卡卡号
            string strSettleCardPhone = strTrMobilePhone; //借记卡预留手机号码
            if (strPlanType == "ATM") //信用卡套现业务
            {
                //查询平台里指定会员的银行借记卡卡号和预留手机号码
                string[] arrySettleCard = GetSettleBankCardInfo(strUnitCode, strPersonCode);
                strSettleCardNo = arrySettleCard[0]; //结算借记卡卡号
                strSettleCardPhone = arrySettleCard[1]; //借记卡预留手机号码
            }

            //根据省份代码，判断如果为直辖市，则省份代码即为城市代码
            string strPayProvince = strPayCity.Substring(0, 6);
            if (strPayProvince == "110000" || strPayProvince == "310000"
                || strPayProvince == "120000" || strPayProvince == "500000")
            {
                strPayCity = strPayProvince; //直接取前六位作为城市代码
            }
            else
            {
                //取中间六位作为城市代码
                strPayCity = strPayCity.Substring(7, 6);
            }

            #endregion

            #region 需要通过公式运算才能得到结果的动态参数

            //手续费金额 = 交易金额 * 手续费比率
            double dTradeServiceFee = iTradeAmount * Convert.ToDouble(strFeeRate);
            dTradeServiceFee = Math.Round(dTradeServiceFee, 2); //保留小数点后两位

            //实收手续费 = 手续费金额 * 手续费折扣
            double dRealServiceFee = dTradeServiceFee * Convert.ToDouble(strDiscount);
            dRealServiceFee = Math.Round(dRealServiceFee, 2); //保留小数点后两位

            //实收手续比率 = 实收手续费 / 交易金额
            double dRealServiceRate = dRealServiceFee / iTradeAmount;
            dRealServiceRate = Math.Round(dRealServiceRate, 4); //保留小数点后四位

            //服务收费总额 = 实收手续费 + 额外收费金额
            double dAllServiceFee = dRealServiceFee + Convert.ToDouble(strFeeFix);

            //最终交易金额 = 交易金额 + 服务收费总额
            double dMoneySum = iTradeAmount + dAllServiceFee;
            dMoneySum = Math.Round(dMoneySum, 2); //保留小数点后两位

            #endregion

            #endregion

            #region 交易订单表XYK_TradeOrder入库需要的全部字段

            //string strPlanID = strPlanID;                                  //计划ID
            //string strTradeType = strTradeType;                            //交易类型
            string strTradeTo = strTradeType.Replace(strPlanType,"");        //资金流向，01=支出、02=收入
            //string strPOrderNum = strPOrderNum;                            //平台订单号
            string strIOrderNum = strPOrderNum;                              //接口订单号
            string strTrBankCardNo = strEnBankCardNo;                        //交易银行卡号          
            //string strTrMobilePhone = strTrMobilePhone;                    //交易预留手机号
            string strPlanTradeTime = strTradeTime;                          //预设交易时间
            string strTradeAmount = iTradeAmount.ToString("0.00");           //交易金额
            string strTradeServiceRate = strFeeRate;                         //手续费比率
            string strTradeServiceFee = dTradeServiceFee.ToString("0.00");   //手续费金额
            string strMemberDiscount = strDiscount;                          //手续费折扣
            string strRealServiceFee = dRealServiceFee.ToString("0.00");     //实收手续费
            string strRealServiceRate = dRealServiceRate.ToString("0.0000"); //实收手续比率
            string strExtraServiceFee = strFeeFix;                           //额外收费金额
            string strAllServiceFee = dAllServiceFee.ToString("0.00");       //服务收费总额
            string strMoneySum = dMoneySum.ToString("0.00");                 //最终交易金额
            //string strPayCity = strPayCity;                                //预设消费城市
            string strMccList = "";                                          //交易MCC码
            string strSeBankCardNo = strSettleCardNo;                        //结算银行卡号
            string strSeMobilePhone = strSettleCardPhone;                    //结算预留手机号
            string strInterCallTime = "";                                    //接口调用时间
            string strRealTradeTime = "";                                    //实际交易时间
            string strRealTradeState = "99";                                 //实际交易状态
            string strRealSettTime = "";                                     //实际结算时间
            string strRealSettState = "99";                                  //实际结算状态
            string strOtherMemo = "";                                        //订单交易表中的其他说明

            #endregion

            #region 生成即将写入数据库的json数组

            JArray objJArray = new JArray();
            JObject objJObject = new JObject();
            objJObject.Add("PlanID", strPlanID);
            objJObject.Add("TradeType", strTradeType);
            objJObject.Add("TradeTo", strTradeTo);
            objJObject.Add("POrderNum", strPOrderNum);
            objJObject.Add("IOrderNum", strIOrderNum);
            objJObject.Add("TrBankCardNo", strTrBankCardNo);
            objJObject.Add("TrMobilePhone", strTrMobilePhone);
            objJObject.Add("PlanTradeTime", strPlanTradeTime);
            objJObject.Add("TradeAmount", strTradeAmount);
            objJObject.Add("TradeServiceRate", strTradeServiceRate);
            objJObject.Add("TradeServiceFee", strTradeServiceFee);
            objJObject.Add("MemberDiscount", strMemberDiscount);
            objJObject.Add("RealServiceFee", strRealServiceFee);
            objJObject.Add("RealServiceRate", strRealServiceRate);
            objJObject.Add("ExtraServiceFee", strExtraServiceFee);
            objJObject.Add("AllServiceFee", strAllServiceFee);
            objJObject.Add("MoneySum", strMoneySum);
            objJObject.Add("PayCity", strPayCity);
            objJObject.Add("MccList", strMccList);
            objJObject.Add("SeBankCardNo", strSeBankCardNo);
            objJObject.Add("SeMobilePhone", strSeMobilePhone);
            objJObject.Add("InterCallTime", strInterCallTime);
            objJObject.Add("RealTradeTime", strRealTradeTime);
            objJObject.Add("RealTradeState", strRealTradeState);
            objJObject.Add("RealSettTime", strRealSettTime);
            objJObject.Add("RealSettState", strRealSettState);
            objJObject.Add("OtherMemo", strOtherMemo);

            objJArray.Add(objJObject);

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将请求结果保存到txt文件中
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", objJArray.ToString(), false);

            DataSet dsData = clsJConvert.JArryToDataSet(objJArray.ToString()); //将Json数组转成DataSet

            clsShare myDict = new clsShare(); //根据人员编码，得到人员ID的值
            string strUserName = myDict.GetNewColValue("Data", "SA_ORG_PERSONINFO", "PERSONCODE", strPersonCode, "PERSONID");

            clsWriteDB myWrite = new clsWriteDB(); //先判断数据是否存在，根据判断结果自动执行insert或者update
            string strKeyColSet = "PlanID,PlanTradeTime,TradeAmount"; //重值判断
            myWrite.WriteDBNormal_UseSYSCol("Data", "XYK_TradeOrder", strKeyColSet, strUserName, dsData);
        }

        #endregion

        #region 获取还款总计划、套现结算借记卡、订单交易费率、会员折扣等信息的公共函数

        //注释：王庆文 2020年04月30日=======================================================================
        //根据平台编码、会员ID、计划ID获取对应的交易计划详细信息
        private DataSet GetRepayPlanInfo(string strUnitCode, string strPersonCode, string strPlanID)
        {
            #region 生成查询还款计划信息的SQL语句

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine(" 	UNITCODE, ");
            sbQuerySQL.AppendLine(" 	PERSONCODE, ");
            sbQuerySQL.AppendLine(" 	PLANID, ");
            sbQuerySQL.AppendLine(" 	PLANTYPE, ");
            sbQuerySQL.AppendLine(" 	PLANTIME, ");
            sbQuerySQL.AppendLine(" 	BANKCARDNO, ");
            sbQuerySQL.AppendLine(" 	PLANAMOUNT, ");
            sbQuerySQL.AppendLine(" 	CARDBALANCE, ");
            sbQuerySQL.AppendLine(" 	PLANDATEBEGIN, ");
            sbQuerySQL.AppendLine(" 	PLANDATEEND, ");
            sbQuerySQL.AppendLine(" 	PAYCITY, ");
            sbQuerySQL.AppendLine(" 	PLANSTATE, ");
            sbQuerySQL.AppendLine(" 	MEMBERLEVEL, ");
            sbQuerySQL.AppendLine(" 	OTHERMEMO ");
            sbQuerySQL.AppendLine("  FROM XYK_REPAYPLAN T ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "T.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("  AND T.UNITCODE='" + strUnitCode + "' ");
            sbQuerySQL.AppendLine("  AND T.PERSONCODE='" + strPersonCode + "' ");
            sbQuerySQL.AppendLine("  AND T.PLANID='" + strPlanID + "' ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString(), false);

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            return myDB.YookingExecuteDataSet("Data", sbQuerySQL.ToString());
        }

        //注释：王庆文 2020年04月30日=========================================================================
        //查询平台里指定持卡人的信用卡预留手机号
        private string GetCreditCardPhone(string strUnitCode, string strPersonCode,string strEnBankCardNo)
        {
            #region 生成查询信息的SQL语句

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine(" 	T.MOBILEPHONE ");
            sbQuerySQL.AppendLine(" FROM XYK_BANKCARD T ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "T.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND T.UNITCODE = '" + strUnitCode + "' ");
            sbQuerySQL.AppendLine("   AND T.PERSONCODE = '" + strPersonCode + "' ");
            sbQuerySQL.AppendLine("   AND T.CARDNO = '" + strEnBankCardNo + "' ");
            sbQuerySQL.AppendLine("   AND T.CARDTYPE = '01' "); //01=信用卡、02=借记卡

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString(), false);

            string strMobilePhone = "00000000000";

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            DataSet dsCard = myDB.YookingExecuteDataSet("Data", sbQuerySQL.ToString());
            if (dsCard != null && dsCard.Tables.Count > 0 && dsCard.Tables[0].Rows.Count > 0)
            {
                DataTable dtCard = dsCard.Tables[0]; //提取DataTable

                strMobilePhone = dtCard.Rows[0]["MOBILEPHONE"].ToString(); //预留手机号 
            }

            return strMobilePhone; //得到信用卡预留手机号
        }

        //注释：王庆文 2020年04月30日================================================================
        //查询平台里指定会员的银行借记卡卡号和预留手机号码
        private string[] GetSettleBankCardInfo(string strUnitCode, string strPersonCode)
        {
            #region 生成查询信息的SQL语句

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine(" 	T.CARDNO, ");
            sbQuerySQL.AppendLine(" 	T.MOBILEPHONE ");
            sbQuerySQL.AppendLine(" FROM XYK_BANKCARD T ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "T.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND T.UNITCODE = '" + strUnitCode + "' ");
            sbQuerySQL.AppendLine("   AND T.PERSONCODE = '" + strPersonCode + "' ");
            sbQuerySQL.AppendLine("   AND T.CARDTYPE = '02' "); //01=信用卡、02=借记卡

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString(), false);

            string[] arrySettleCard = { "0000000000000000000", "00000000000" };

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            DataSet dsCard = myDB.YookingExecuteDataSet("Data", sbQuerySQL.ToString());
            if (dsCard != null && dsCard.Tables.Count > 0 && dsCard.Tables[0].Rows.Count > 0)
            {
                DataTable dtCard = dsCard.Tables[0]; //提取DataTable

                arrySettleCard[0] = dtCard.Rows[0]["CARDNO"].ToString(); //借记卡卡号（密文） 
                arrySettleCard[1] = dtCard.Rows[0]["MOBILEPHONE"].ToString(); //预留手机号 
            }

            return arrySettleCard; //得到密文卡号、预留手机号
        }

        //注释：王庆文 2020年04月30日================================================================
        //查询平台里指定交易类型的单笔交易费率、以及固定笔数费
        private string[] GetTradeFeeRate(string strUnitCode,string strTradeType)
        {
            strTradeType = strTradeType.ToUpper();

            #region 生成查询信息的SQL语句

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine(" 	T." + strTradeType + "FEERATE, ");
            sbQuerySQL.AppendLine(" 	T." + strTradeType + "FEEFIX ");
            sbQuerySQL.AppendLine(" FROM XYK_TRADEFEERATE T ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "T.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND T.UNITCODE = '" + strUnitCode + "' ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString(), false);

            string[] arryFeeRate = { "0.008", "1" }; //交易费率及笔数费

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            DataSet dsRate = myDB.YookingExecuteDataSet("Data", sbQuerySQL.ToString());
            if (dsRate != null && dsRate.Tables.Count > 0 && dsRate.Tables[0].Rows.Count > 0)
            {
                DataTable dtRate = dsRate.Tables[0]; //提取DataTable

                arryFeeRate[0] = dtRate.Rows[0][strTradeType + "FEERATE"].ToString(); //交易费率
                arryFeeRate[1] = dtRate.Rows[0][strTradeType + "FEEFIX"].ToString();  //固定笔数费
            }

            return arryFeeRate; //得到交易费率、固定笔数费
        }

        //注释：王庆文 2020年04月30日=========================================================================
        //查询平台里指定计划类型的，指定级别的会员可以享受的交易费率折扣
        private string GetMemberDiscount(string strUnitCode, string strPlanType,string strMemberLevel)
        {
            strPlanType = strPlanType.ToUpper();

            #region 生成查询信息的SQL语句

            StringBuilder sbQuerySQL = new StringBuilder();
            sbQuerySQL.AppendLine(" SELECT ");
            sbQuerySQL.AppendLine(" 	" + strPlanType + "DISCOUNT ");
            sbQuerySQL.AppendLine(" FROM XYK_MEMBER_BKGEPLAN T ");
            sbQuerySQL.AppendLine(" WHERE " + clsSQLSyntax.IsNullSQL("Data", "T.SYS_CANCELDATETIME"));
            sbQuerySQL.AppendLine("   AND T.UNITCODE = '" + strUnitCode + "' ");
            sbQuerySQL.AppendLine("   AND T.MEMBERLEVEL = '" + strMemberLevel + "' ");

            #endregion

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", sbQuerySQL.ToString(), false);

            string strDiscount = "1"; //会员折扣值

            clsDbSQLLogic myDB = new clsDbSQLLogic(); //实例化数据库操作类
            DataSet dsZK = myDB.YookingExecuteDataSet("Data", sbQuerySQL.ToString());
            if (dsZK != null && dsZK.Tables.Count > 0 && dsZK.Tables[0].Rows.Count > 0)
            {
                DataTable dtZK = dsZK.Tables[0]; //提取DataTable

                strDiscount = dtZK.Rows[0][strPlanType + "DISCOUNT"].ToString(); //交易折扣
            }

            return strDiscount; //得到会员折扣值
        }

        #endregion

        #region 计算交易总天数、拆分交易时段、交易金额的公共逻辑

        //注释：王庆文 2020年04月29日 ========================================================
        //计算出用户自定义选择的计划还款总天数
        private int GetPlanDaysCount(string strPlanDateBegin, string strPlanDateEnd)
        {
            DateTime dtStart = Convert.ToDateTime(strPlanDateBegin);
            DateTime dtEnd = Convert.ToDateTime(strPlanDateEnd);

            //开始逻辑运算，得到总天数
            TimeSpan tsLength = dtEnd.Subtract(dtStart);
            int iDays = tsLength.Days; //两个日期之间相差的天数
            iDays = iDays + 1; // +1 之后才是执行计划的总天数

            //clsRWFile myLog = new clsRWFile(); //将待执行的SQL语句记录下来
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", strPlanDateBegin + "\r\n", true);
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", strPlanDateEnd + "\r\n", true);
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", iDays.ToString() + "\r\n", true);

            return iDays; //客户自己填写的还款周期
        }

        //注释：王庆文 2020年04月30日=============================================
        //根据刷卡消费顺序，随机生成时间范围内的时间值
        //刷卡时段、还款时段的定义：
        //   09:00 - 10:00  刷卡
        //   11:00 - 12:00  刷卡
        //   13:00 - 14:00  还款 = 前两笔的刷卡总额
        //   15:00 - 16:00  刷卡
        //   17:00 - 18:00  刷卡
        //   19:00 - 20:00  还款 = 前两笔的刷卡总额
        private string GetRandomTradeTime(int iLoopIndex)
        {
            string strTimeValue = "00:00:00"; //设定新的交易时间

            //生成m,n之间的整型随机数
            Random rdNumber = new Random();
            int iMinute = rdNumber.Next(10, 59);  //随机生成分钟
            int iSeconds = rdNumber.Next(10, 59); //随机生成秒

            if (iLoopIndex == 0)
            {
                //将时间设定在 09:00 - 10:00 之间 
                strTimeValue = "09:" + iMinute + ":" + iSeconds;
            }
            else if (iLoopIndex == 1)
            {
                //将时间设定在 11:00 - 12:00 之间
                strTimeValue = "11:" + iMinute + ":" + iSeconds;
            }
            else if (iLoopIndex == 2)
            {
                //建议时间设定在 15:00 - 16:00 之间
                strTimeValue = "15:" + iMinute + ":" + iSeconds;
            }
            else if (iLoopIndex == 3)
            {
                //建议时间设定在 17:00 - 18:00 之间
                strTimeValue = "17:" + iMinute + ":" + iSeconds;
            }

            return strTimeValue; //最终生成的交易时间值
        }

        //注释：王庆文 2020年04月30日===================================================
        //以金额iNormAmount为基准，生成正负50元之内的随机刷卡金额
        private double GetRandomTradeAmount(double iNormAmount)
        {
            int iMinNumber = Convert.ToInt32(iNormAmount) - 50;
            int iMaxNumber = Convert.ToInt32(iNormAmount) + 50;

            //生成m,n之间的整型随机数
            Random rdNumber = new Random(); 
            int iIntPart = rdNumber.Next(iMinNumber, iMaxNumber); //金额的整数部分
            int iDotPart = rdNumber.Next(0, 99); //金额的小数部分

            //在指定数值范围内随机生成订单交易金额，
            //统一设置成保留小数点后两位的格式。
            string strIntPart = iIntPart.ToString();
            string strDotPart = iDotPart.ToString();
            string strTradeAmount = strIntPart + "." + strDotPart;

            //clsRWFile myLog = new clsRWFile(); //将请求结果保存到txt文件中
            //myLog.WriteInfoToTxtFile("SysLog", "wqw.txt", strTradeAmount + "\r\n");

            return Convert.ToDouble(strTradeAmount); //得到实际待交易的金额
        }

        #endregion

        #endregion




    }
}
